package Reeks5.VanRansbeeck.Kevin.View;

import Reeks5.VanRansbeeck.Kevin.Model.*;
import Reeks5.VanRansbeeck.Kevin.Controller.*;
import Reeks5.VanRansbeeck.Kevin.Model.States.Game.*;
import Reeks5.VanRansbeeck.Kevin.Util.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Observer;

public class GameGUI extends JFrame implements Observer {
    protected Speler speler;
    protected List<Speler> bots;
    protected Spel spel;
    
    JPanel wrapper;
    Box westView, centerView;
    JPanel stateView, saldoView, buttonView;
    JMenuBar menuBar;
    GameToolbar toolbar;
    
    JLabel gameState;
    
    JButton start,draw;
    
    PlayerkaartenPanel playerkaarten;
    TafelkaartenPanel  tafelkaarten;
    

    
    public GameGUI(String naam) {
        super("Game GUI");
        
        this.setResizable(true);
        
        this.setLayout(new BorderLayout());
        
        spel = new PokerSpel();
        
        speler = new PokerSpeler(naam, spel);
        
        spel.addSpeler(speler);
        
        
        
        // BOTS
        bots = new ArrayList<Speler>();
        Botnamen names = new Botnamen();
        for(int i = 0; i < 7; i++) {
            // 7 Bots
            Speler b = new PokerSpeler(names.randomNaam(), spel);
            bots.add(b);
            spel.addSpeler(b);
        }
        
        playerkaarten = new PlayerkaartenPanel(2, speler);  // # kaarten nog "abstract" maken ipv hardcoded!
        tafelkaarten  = new TafelkaartenPanel(5, spel);     // # kaarten nog "abstract" maken ipv hardcoded!
        
        Container cont = this.getContentPane();
        
        // MENUBAR
        menuBar = new JMenuBar();
        
        this.setJMenuBar(menuBar);
        
        JMenu gameMenu = new JMenu(Settings.lang.getGame());
        menuBar.add(gameMenu);
        
        JMenuItem restartItem = new JMenuItem(Settings.lang.getRestart());
        JMenuItem closeItem = new JMenuItem();
        
        gameMenu.add(restartItem);
        gameMenu.add(closeItem);
        
        restartItem.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                //spel.restart();
            }
        });
        closeItem.setAction(new CloseActionListener());
        
        // STATEVIEW        
        stateView = new JPanel();
        
        StatePanel statepanel = new StatePanel(spel);
        
        stateView.add(statepanel);
        
        buttonView = new JPanel();
        
        start = new SplashButton(Settings.lang.getStart()); // reset values/states + drawt de speler zijn 2 kaarten
        draw = new SplashButton("Flop");                    // default disabled - vanaf iedereen gebet heeft > flop > terug betten > turn > betten > river
        draw.setEnabled(false);
        
        speler.addObserver(playerkaarten);
        
        // pre-flop drawing
        start.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                getSpel().drawAlleSpelersKaart();
                getSpel().drawAlleSpelersKaart();
                getSpel().blinds();
                start.setEnabled(false);
                toolbar.toggleActionButtons(); // enable alleen de buttons die nu kunnen
            }
        });
        
        spel.addObserver(tafelkaarten);
        
        draw.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                getSpel().drawFlop();
                draw.setEnabled(false);
                toolbar.toggleActionButtons();
                System.out.println(spel);
            }
        });
        
        gameState = new JLabel(spel.getSpelContext().toString());
        
        spel.getSpelContext().addObserver(this);
        
        buttonView.add(start);
        buttonView.add(draw);
        buttonView.add(gameState);
        
        // WESTERN CONTAINER
        westView = Box.createVerticalBox();
        
        westView.add(stateView);
        westView.add(buttonView);
        
        
        wrapper = new JPanel(new BorderLayout());
        
        wrapper.add(westView, BorderLayout.WEST);
        
        // SALDO VIEW
        saldoView = new JPanel();
        
        for(Speler s : spel.getSpelers()) {
            SaldoPlayerTile tile = new SaldoPlayerTile(s);
            s.addObserver(tile);
            s.addObserver(statepanel);
            saldoView.add(tile);
        }
        
        // CENTER CONTAINER
        centerView = Box.createVerticalBox();
        centerView.add(saldoView);
        centerView.add(tafelkaarten);
        
        centerView.add(playerkaarten);
        
        wrapper.add(centerView, BorderLayout.CENTER);
        
        // SOUTH
        toolbar = new PokerToolbar(this);
        
        cont.add(wrapper, BorderLayout.CENTER);
        cont.add(toolbar, BorderLayout.SOUTH);
          
        
        
        // ALGEMEEN [Instellingen]
        
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds(0, 0, screen.width, screen.height);
        
        this.setVisible(true);
        
        
    }

    public PlayerkaartenPanel getPlayerkaarten() {
        return playerkaarten;
    }

    public void setPlayerkaarten(PlayerkaartenPanel playerkaarten) {
        this.playerkaarten = playerkaarten;
    }

    public TafelkaartenPanel getTafelkaarten() {
        return tafelkaarten;
    }

    public void setTafelkaarten(TafelkaartenPanel tafelkaarten) {
        this.tafelkaarten = tafelkaarten;
    }
    
    

    public List<Speler> getBots() {
        return bots;
    }

    public void setBots(List<Speler> bots) {
        this.bots = bots;
    }
    
    public Speler getSpeler() {
        return speler;
    }
    
    public Spel getSpel() {
        return spel;
    }
    
    private void toggleActionButtons() {
        if(spel.getSpelContext().getSpelState() instanceof NewState) {
            start.setEnabled(true);
        } else {
            start.setEnabled(false);
            
            if(spel.getSpelContext().getSpelState() instanceof BlindState) {
                draw.setText("Flop");
                draw.setEnabled(true);
                // draw.setAction( flopdrawlistener )
            } else if(spel.getSpelContext().getSpelState() instanceof FlopState) {
                draw.setText("Turn");
                draw.setEnabled(true);
                // draw.setAction( turndrawlistener )
            } else if(spel.getSpelContext().getSpelState() instanceof RiverState) {
                draw.setText("River");
                draw.setEnabled(true);
                // draw.setAction( riverdrawlistener )
            } else {
                draw.setEnabled(false);
            }
            
        }
        
    }

    public void update(Observable o, Object o1) {
        toggleActionButtons();
        toolbar.toggleActionButtons();
        gameState.setText(getSpel().getSpelContext().toString());
        gameState.repaint();
    }
    
}
